def make_crc8_table(poly=0x07):
    """
    生成 CRC8 查找表（256 字节）
    :param poly: 生成多项式（默认 0x07 = x⁸ + x² + x + 1）
    :return: 预计算的 CRC8 查找表
    """
    table = []
    for byte in range(256):
        crc = byte
        for _ in range(8):  # 处理每个比特位
            if crc & 0x80:  # 检测最高位是否为1
                crc = ((crc << 1) ^ poly) & 0xFF
            else:
                crc = (crc << 1) & 0xFF
        table.append(crc)
    return table

def crc8(data, table, init=0x00, xor_out=0x00):
    """
    高性能 CRC8 计算（查表法）
    :param data: 输入字节数据（bytes/bytearray）
    :param table: 预计算的 CRC8 表
    :param init: 初始值（默认 0x00）
    :param xor_out: 结果异或值（默认 0x00）
    :return: 8位 CRC 校验值
    """
    crc = init
    for byte in data:
        crc = table[(crc ^ byte) & 0xFF]
    return (crc ^ xor_out).to_bytes(1,'big')

def verify_crc8(data, received_crc, table, init=0x00, xor_out=0x00):
    """
    CRC8 验证器
    :param data: 原始数据（不包括CRC部分）
    :param received_crc: 接收到的CRC值
    :param table: 预计算的 CRC8 表
    :param init: 初始值（需与发送方一致）
    :param xor_out: 结果异或值（需与发送方一致）
    :return: 验证结果（True=校验通过，False=校验失败）
    """
    test_data = data + received_crc
    
    calculated_crc = crc8(test_data, table, init, xor_out)
    return calculated_crc == b'\x00'



if __name__ == "__main__":
    # 1. 预生成常用多项式对应的CRC表
    CRC8_TABLE_07 = make_crc8_table(poly=0x07)      # 标准多项式 x⁸ + x² + x + 1
    CRC8_TABLE_1C3 = make_crc8_table(poly=0x1C3)    # 多项式 x⁸ + x⁵ + x³ + x² + x + 1
    CRC8_TABLE_1D = make_crc8_table(poly=0x1D)      # SAE J1850 标准
    
    # 2. 计算CRC校验值
    test_data = b"\x01\x02\x03\x04\x05"
    
    # 使用不同多项式计算
    crc1 = crc8(test_data, CRC8_TABLE_07)

    
    print(f"CRC8 (poly=0x07): {crc1}")

    
    # 3. 验证CRC校验值
    valid = verify_crc8(test_data, crc1, CRC8_TABLE_07)
    print(f"\n验证结果 (正常数据): {valid}")
    
    # 模拟数据篡改（最后一个字节修改）
    corrupted_data = b"\x01\x02\x03\x04\x06"
    valid_corrupted = verify_crc8(corrupted_data, crc1, CRC8_TABLE_07)
    print(f"验证结果 (篡改数据): {valid_corrupted}")